package modelo.persistencia;

import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceException;
import modelo.dominio.Locacao;
import modelo.dominio.Pessoa;
import modelo.dominio.TipoLocacao;
import modelo.dominio.TipoVeiculo;
import modelo.dominio.Usuario;
import modelo.dominio.Veiculo;

public abstract class DAOBase {
	
	private static final String PERSISTENCE_UNIT_NAME = "LocarraoJPA";
	private EntityManagerFactory factory = null;
	
	public DAOBase() {
		factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
	}
	
	protected EntityManager getEntityManager(){
		EntityManager em = factory.createEntityManager();
		return em;
	}
	
	public Object consultar(Object object) {
		EntityManager em = getEntityManager();
		Object resultado;
		if (object instanceof Pessoa){
			Pessoa pessoaConsulta = (Pessoa)object;
			long cpf = pessoaConsulta.getCpf();
			resultado = em.find(Pessoa.class, cpf);
			return (Pessoa)resultado;
		}
		else if (object instanceof Usuario) {
			Usuario usuario = (Usuario)object;
			String nome = usuario.getNome();
			resultado = em.find(Usuario.class, nome);
			return (Usuario)resultado;
		}
		else if (object instanceof Veiculo){
			Veiculo veiculo = (Veiculo)object;
			String placa = veiculo.getPlaca();
			resultado = em.find(Veiculo.class, placa);
			return (Veiculo)resultado;
		}
		else if (object instanceof Locacao) {
			Locacao locacao = (Locacao)object;
			int id = locacao.getIdLocacao();
			resultado = em.find(Locacao.class, id);
			return (Locacao)resultado;
		}
		else if (object instanceof TipoLocacao){
			TipoLocacao tipoLocacao = (TipoLocacao)object;
			int id = tipoLocacao.getIdTipoLocacao();
			resultado = em.find(TipoLocacao.class, id);
			return (TipoLocacao)resultado;
		}
		else if (object instanceof TipoVeiculo) {
			TipoVeiculo tipoVeiculo = (TipoVeiculo)object;
			int id = tipoVeiculo.getIdTipoVeiculo();
			resultado = em.find(TipoVeiculo.class, id);
			return (TipoVeiculo)resultado;
		}
		return null;
	}
	
	public void salvar(Object object) {
		EntityManager em = getEntityManager();
		try {
			em.getTransaction().begin();
			em.persist(object);
			em.getTransaction().commit();
		} finally {
			//em.close();
		}
	}
	
	public void remover(Object object) {
		EntityManager em = getEntityManager();
		Object objectConsulta;
		try {
			em.getTransaction().begin();
			objectConsulta = em.merge(object);
			em.remove(objectConsulta);
			em.getTransaction().commit();
		} catch (PersistenceException e) {
			throw new NullPointerException("Objeto não encontrado\n" + object);
		} finally{
			//em.close();
		}
	}
	
	public void atualizar(Object object) {
		EntityManager em = getEntityManager();
		Object temp;
		try {
			temp = consultar(object);
		} catch (NullPointerException e){
			throw new IllegalArgumentException("Objeto não encontrado\n" + object);
		}
		temp = object;
		em.getTransaction().begin();
		em.merge(temp);
		em.getTransaction().commit();
	}
	
}
